(for Internet Explorer)
Dim E_Others            : E_Others            = 1

Dim E_TestPass          : E_TestPass          = 21
Dim E_TestSkip          : E_TestSkip          = 22
Dim E_TestFail          : E_TestFail          = 23

Dim E_BuildFail         : E_BuildFail         = &h80041004
Dim E_OutOfWritable     : E_OutOfWritable     = &h80041005
Dim E_NotFoundSymbol    : E_NotFoundSymbol    = &h80041006
Dim E_ProgRetNotZero    : E_ProgRetNotZero    = &h80041007
Dim E_Unexpected        : E_Unexpected        = &h80041008
Dim E_TimeOut           : E_TimeOut           = &h80041009

Dim E_WIN32_FILE_NOT_FOUND: E_WIN32_FILE_NOT_FOUND = &h80070002
Dim E_WIN32_DIRECTORY     : E_WIN32_DIRECTORY      = &h8007010B

Dim E_ProgTerminated    : E_ProgTerminated    = &hC0000005

Dim E_BadType           : E_BadType           = 13
Dim E_FileNotExist      : E_FileNotExist      = 53
Dim E_EndOfFile         : E_EndOfFile         = 62
Dim E_WriteAccessDenied : E_WriteAccessDenied = 70
Dim E_ReadAccessDenied  : E_ReadAccessDenied  = 70
Dim E_PathNotFound      : E_PathNotFound      = 76
Dim E_AlreadyExist      : E_AlreadyExist      = 58
(src)
関連
→ Windows エラーコード
が呼ばれないで、スクリプトが終了しました。
または
〜 TryEnd でエラー処理するときの最後に必要な
を設定して、エラーが発生した場所でブレークして、コールスタックを参照
して、TryStart 〜 TryEnd のエラー処理に、Err2::Clear または Err2::Raise を記述してください。
<ERROR msg="Script finished before Err2.Clear or Raise the error"
jp="エラー処理の途中で終了しました。Err2.Clear または再 Raise してください"
err_symbol="E_NotClear" />
エラーメッセージ:
VBScript global code (メインvbs の vbslib include)
ResumePop
CallFinalizeInModules
(= g_FinalizeModules(i))
FinalizeModule (vbslib.vbs)
Err2.OnSuccessFinish
echo  GetErrStr( num, Description )
0
<ERROR msg="Out of Diff"
src=
 "C:\folder\file1.txt"
dst=
 "C:\folder"
/>
<ERROR
ログを検索する時は、"<ERROR " で検索すると、すぐに見つかります。
エラーが発生したときは、"<WARNING " で検索すると問題を解決するヒント
が得られるかもしれません。
msg
自然言語のエラーメッセージ
src, dst など
値がパスのときは、タグジャンプができるように新しい行から値を書く。
関連
XML を使って、エラー情報を構造化します。
もしエラー情報の一部を取得したいときは、エラーメッセージ(Err2.Description) を
に渡してください。 参考
<ERROR msg="シンボルが見つかりません" path="SymbolA"/>
<WARNING msg="アップデートのチェックはスキップしました。"/>
Sub  Error()
簡易的にその他のエラーを発生させます。

コーディングが最も楽なエラー発生です。 その代わり、エラーの内容はユーザに
伝わりません。 cscript.exe のエラーレベルは 1 になります。
エラー値を返す API やライブラリは、少なくとも、正常に処理されたことを示す値
でなかったら、本関数を呼び出して、緊急停止させます。

想定済みのエラーであれば、ユーザがエラーに対応できるように、Raise などを
使ってエラー処理を実装してください。
想定外のエラーや開発者が発生させたことがないエラーは、本関数を呼び出して、
緊急停止させます。
(src)
関連
エラーを発生させる。
Sub  OrError()
Stop:OrError
サンプル
子プロセスであっても、そのコードを実行したところでブレークできるようにします。
(src)
通常、上記のように Stop 命令と同時に使用します。
g_debug = 0 の状態で上記のコードを実行したときは、OnError 関数の中でエラーが発生します。
このエラーにより、このコードでブレークするために必要な設定が、エラーメッセージに表示され
ます。
参考
ブレークするために必要な設定を行って、スクリプトを再起動すると、Stop 命令によってブレーク
します。 続いて実行される OnError 関数の中では何もしないので、続きをステップ実行できます。
Sub  Raise( ErrorNum as integer, Description as string )
新規にエラーを発生させます。
Raise  1, "ファイルが見つかりません c:\a.txt"
【引数】
ErrorNum
Description
参考
エラーメッセージ
(src)
関連
簡単に実装できるエラー発生
標準形式のエラーメッセージを返す。
条件が満たされているかをチェックします。
サンプル
Sub  Warning( Description as string )
警告を表示してプロセスを終了します。
(src)
【引数】
Description
警告メッセージ
エラーコード E_TestPass(=21) のエラーが発生します。
Warning  "アップデートのチェックはスキップしました。"
サンプル
<WARNING msg="アップデートのチェックはスキップしました。"/>
→ T_Warning フォルダー
テスト
表示内容:
スクリプト:
Function  GetErrStr( e_num as integer, e_desc as string ) as string
標準形式のエラーメッセージを返す。
【引数】
e_num
e_desc
エラーコード
エラーメッセージ
(src)
サンプル:
関連
  Dim  e ' as Err2
  echo_v  GetErrStr( e.num, e.desc )
エラーメッセージの例:
<ERROR err_number='500' err_description='この変数は宣言されていません。'/>
    Dim  e  ' as Err2
    If TryStart(e) Then  On Error Resume Next
        ...
    If TryEnd Then  On Error GoTo 0
    If e.num <> 0 Then
        e.OverRaise  e.Number,  AppendErrorMessage( e.Description, _
            "msg2=""追加メッセージ。""" )
    End If
Function  AppendErrorMessage( in_OldMessage  as string,  in_Appending_XML_Attributes  as string )
    as string
AppendErrorMessage
サンプル
ソース
エラーが発生して、そのエラーメッセージが XML 形式なら、属性
msg2="追加メッセージ。" を追加します。
エラーメッセージを追加します。
【引数】
in_OldMessage
in_Appending_XML_Attributes
今までのエラーメッセージ
追加するエラーメッセージ、XML 属性の形式
返り値
新しいエラーメッセージ
→ vbs_inc_sub.vbs
参考
Function  TryStart( e as Err2 ) as boolean
Try ブロックの開始に記述します。
On Error Resume Next を呼び出すべきかどうかを判定します。
(src)
参考
ほとんどの場合、1つ目のエラーを対処することで、2つ目のエラーは発生しなくなるため、
2つ目のエラーが発生したときに、1つ目のエラーの情報が上書きされて消えてしまうことが
ないようにすることが重要です。
エラーが発生(1)
TryStart
TryEnd
エラーが発生(2)
← このエラーが前のエラーの情報を消してしまう
処理
TryEnd
TryStart
エラーにしている理由
対処方法
エラーメッセージに表示されているように、g_debug 変数などの値を設定し、エラーが
発生している場所、つまり、TryStart の中の Stop 命令でブレークさせます。
1.
Err.Number が 0 以外なら、Err.Description の値を、e.num が 0 以外なら e.desc の
Err2::desc の値を表示させて、1つ前のエラーの内容を確認します。
2.
なお、多くの場合、TryStart を使わない On Error Resume Next によって、そこで
発生したエラーでブレークすることができなくなっています。
コールスタックを上にたどっていき、On Error Resume Next が無いか探します。
あったら、おそらく、そこで1つ前のエラーが発生しているので、そのエラーを発生
させなくするか、クリアすることで対処してください。
3.
VBScript の不具合に対する対処
Class_Initialize か Class_Terminate で発生したエラーは、VBScript は投げられま
せん(エラーによる中断をしません)。
を呼び出してください。
または
していない
(もし、
オプションを使っていたら、使わないで動かしてください。 エラーの状況
と、/g_debug の設定が合っていないと、誤って TryStart のエラーになることがあります。)
    If TryStart(e) Then  On Error Resume Next
        CreateFile  fo + "\a.txt", "ABC"      // 異なるエラーか発生
    If TryEnd Then  On Error GoTo 0
    If e.num <> E_OutOfWritable  Then Fail    // ここのチェックで引っかかる
異なるエラーが発生した場所を知るには、チェックする前に
"Test.vbs" /g_debug:5,1
----------------------------------------------------------------------
<ERROR err_number='1' err_description='エラー'/>
e.Raise
    If e.num <> E_OutOfWritable  Then Fail
してください。
それでも /g_debug オプションに設定すべき値の表示が変わらないときは、エラーが
発生していない可能性があります。 エラーが発生していないときの問題は、/g_debug
オプションで自動的にエラーが発生した場所を表示することはできません。
Function  TryEnd() as boolean
Try ブロックの終了に記述します。
On Error GoTo 0 を呼び出すべきかどうかを判定します。
参考
(src)
Function  Trying() as boolean
Try ブロックの中で記述します。
エラーが発生していたら False を返します。
参考
(src)
(src)
Sub  ErrCheck()
これまでの処理で、エラーがあったかどうかをチェックして、エラーがあったら発生させます。
クラスの Class_Initialize メソッドの中でエラーが発生しても、VBScript は、続きを実行してしまい、
エラーを見つけるのが困難になります。 new でオブジェクトを生成したら、本関数を呼び出して
ください。
サンプル:
Set  obj = new ClassA : ErrCheck
キーワード:
テスト
関連
Sub  ErrorCheckInTerminate( ErrNumAtStart as integer )
クラスの Class_Terminate の中で発生したエラーを表示します。
エラーが発生していたら、Err オブジェクトの内容を echo 出力して Stop または pause します。
エラーが発生していなかったら(Err.Number = 0 なら)、何もしません。
Class_Terminate の中でエラーを発生させることはできないので、ErrorCheckInTerminateも
エラーを発生させません。
Private Sub  Class_Terminate()
  Dim  en,ed : en = Err.Number : ed = Err.Description
  On Error Resume Next  '// This clears error

  If en=0 or en=21 Then
  Else
    del  Me.TmpDstPath
  End If

  ErrorCheckInTerminate  en
  On Error GoTo 0 : If en <> 0 Then  Err.Raise en,,ed  '// This sets en again
End Sub
サンプル:
(src)
参考
【引数】
ErrNumAtStart
Class_Terminate に入った直後のエラーコード
ErrorCheckInTerminate
→ T_Finish.vbs # ErrorCheckInTerminate
テスト
  On Error Resume Next  '// This clears error
If g_count_up(0)=0 Then  Stop
echo "g_count(0)=" & g_count(0) '// watch-> g_count [TODO]
If g_count(0) = 99 Then  On Error GoTo 0
エラーが発生したときに対処法
Class_Terminate の中で発生したエラーでブレークさせる方法を説明します。
On Error Resume Next の後に、下記のコードを記述してください。
一度実行したら、最後の行の 99 を g_count(0) の値に変更して再度実行してください。
0
0
0
0
99
参考
なるべく、Class_Terminate の中では、複雑な処理をしないで、
エラーが発生したことを示すフラグを立てて、後で処理してください。
Sub  NotCallFinish()
Finish が呼ばれないで、クラスの Class_Terminate が呼ばれたときにエラー表示します。
関連
Private Sub  Class_Terminate()
  If en = 0 and not Me.IsFinished Then  NotCallFinish
End Sub
サンプル:
(src)
FinObj クラスを使うと、Finally ブロックに似た記述をすることができます。
FinObj のデストラクターから、Finally ブロックに相当する関数を呼び出します。
エラーが発生しても、続きを実行したり、キャッチしたりしませんが、Finally ブロックは実行します。
VBA の On ErroroGoto (Label) に相当する機能です。 WSH の VBScript では Goto は 0 しかできません。
Sub  FuncA( Path )
    Set fin = new FinObj : fin.SetFunc "FuncA_Finally"

    ren  Path, "a.txt" : fin.SetVar "Path", Path  '// 戻すときのデータを記録
      :
    fin.SetVar "Path", Empty  '// 正常時は戻さないならデータを削除
End Sub
 Sub  FuncA_Finally( Vars )  '// Finally ブロックに相当
    en = Err.Number : ed = Err.Description : On Error Resume Next  '// This clears error

    path = Vars.Item("Path")  '// 戻すデータを取得
    If not IsEmpty( path ) Then
        ren  "a.txt", path  '// 戻す処理
    End If

    ErrorCheckInTerminate  en : On Error GoTo 0 : If en <> 0 Then  Err.Raise en,,ed  '// This sets en again
End Sub
FuncA_Finally
Path
FuncA_Finally
Path
ren  Path, "a.txt"
ren  "a.txt", path
記述例: 関数の場合
関連
(src)
ローカル変数のデストラクタが動く順番に依存しないようにしてください。
Sub  FuncA( Path )
  Dim  fin : Set fin = new FinObj : fin.SetFunc "FuncA_Finally"
  Dim  ds_:Set ds_= New CurDirStack
  fin.SetVar "CurDir", g_fs.CurrentDirectory
    :
End Sub :  Sub  FuncA_Finally( Vars )
  del  Vars.Item("CurDir") + "\_temporary_folder"
End Sub
たとえば、下記のように、デストラクタでカレント・フォルダが変わるとき、FuncA_Finally が
呼ばれるタイミングが、カレント・フォルダが変わる前か後かどうか不定なので、Finally
ブロックで相対パスを指定することはできません。
Class  ClassA
Public Sub  FuncA( Path )
    Set fin = new FinObj : fin.SetFunc "FuncA_Finally"
      :
End Sub : Public Sub  FuncA_Finally( Vars )  '// Finally ブロックに相当
      :
End Sub
End Class

Sub  ClassA_FuncA_Finally( Vars ) : Vars.Item("Me").FuncA_Finally( Vars ) : End Sub
記述例: メソッドの場合
関連
ResumePop
CallFinalizeInModules
:
Err.Raise
g_FinalizeInModulesCaller.Class_Terminate
CallFinalizeInModules
1
(= g_FinalizeModules(i))
FinalizeModule (vbslib.vbs)
0
(= g_FinalizeModules(i))
FinalizeModule (vbslib.vbs)
On Error Goto 0 していないときは 1
(メインvbs の vbslib include)
(メインvbs の vbslib include)
関連
WScript.Echo  Err.Description
If g_CommandPrompt = 1 Then
    WScript.Sleep  2000
エラーメッセージを見ても分からないときは、スクリプトの開発者に質問してください。
あなたが開発者であるときは、デバッグモードで動かしてみてください。
サポート
ホームページにあるサポート掲示板かメールアドレスへ
… スルーカウンタ
… デバッグ機能の設定場所
… 起動時のパラメーターを指定する
debugger.bat
Test.vbs ファイルをデバッガにアタッチします
@wscript //x Test.vbs
@pause
モジュールの一部が動きますが、
そこをデバッグするときは、下記のバッチファイルを実行してください。
デバッグを中止するときは、kill_wscript.bat を実行してください。
デバッグを中止するときは、コマンドプロンプトを閉じてください。
コマンドプロンプトが表示されていないときは、kill_wscript.bat を実行してください。
C:\home\sample.vbs(34, 3)
Microsoft VBScript 実行時エラー: この変数は宣言されていません。: 'e'
デバッガが無くても、g_debug=1 にすれば、エラーメッセージが詳しくなることがあります。
[ERROR](500) この変数は宣言されていません。
g_debug=0
g_debug=1
g_debug=1 にすると、詳しい動作内容が表示されたり、エラーが発生したらブレーク
したりするなど、若干動きが異なります。 この動きをさせないで、デバッガに接続する
には、g_debug=0 にして、下記のバッチファイルを実行してください。
内部で、デバッガに接続するまでに、
@cscript //x Test.vbs /g_debug:0
@pause
Test.vbs ファイルをデバッガにアタッチします
debugger.bat
wscript ではないことに注意
=0 なら wscript にしてください
ただし、
wscript であることに注意
ただし、行番号が出るのは、文法エラーのみです。
コールスタック(デバッグ | ウィンドウ | 呼び出し履歴)を見れば、全体から見てどの部分で
止まっているかが分かります。
'// g_SrcPath="C:\Folder\vbslib\Sample.vbs"   ... デバッグ時に自動的に付きます
Dim  g_SrcPath

Class  Sample_vbs : Public FullPath : End Class
Dim  g_Sample_vbs
Set  g_Sample_vbs =_
   new Sample_vbs
With g_Sample_vbs
  .FullPath = g_SrcPath
End With

Class  ClassA
  Public Property Get  DefineInfo() : Set DefineInfo = g_Sample_vbs
     End Property
End Class
メイン・スクリプトのパスは、WScript.ScriptFullName プロパティの値を見れば
分かりますが、インクルードしたスクリプトのパスは、通常分かりません。
しかし、g_debug=1 でデバッガに接続したときに表示される vbslib のソースは、
1行目にフル・パスが記述されたコメントが付きます。 (ただし、Visual Studio 2012 では、
すべてのファイルが1つのウィンドウにまとめられてしまうため、"g_SrcPath=" で上方向
に検索してください。)

また、ソースの先頭に下記のような記述があり、
g_SrcPath の値を代入した g_〜_vbs.DefinePath 変数の値に、インクルードしたスクリプト
のパスが入っています。 Visual Studio では、この変数を選択してウォッチ・ウィンドウへ
ドロップし、値(パス、" "付きでも可)をコピーして、 ファイル・オープンで開けます。
もし、g_〜_vbs.DefinePath 変数が無くても、最後の call_vbs, call_vbs_d が呼び出している
関数を定義しているスクリプトのパスなら、g_SrcPath の値から知ることができます。
最後以外は、コールスタックを目的の call_vbs, call_vbs_d に切り替えて、 path 引数
の値を調べることで分かります。
また、下記の式の値が True なら、最後の call_vbs, call_vbs_d が、メイン・スクリプト
の関数を呼び出していると判断できます。
g_SrcPath = WScript.ScriptFullName
.vbs ファイルの先頭
vbs ファイルが、main 関数を持ち、include もされる場合、上記の実装では、二重定義
エラーになります。 下記のように実装してください。
Dim  g_Sample_vbs
If  IsEmpty( g_Sample_vbs ) Then  Declare_g_Sample_vbs
Sub  Declare_g_Sample_vbs
  ExecuteGlobal  "Class  Sample_vbs : Public FullPath : End Class"
  Set  g_Sample_vbs =_
     new Sample_vbs
  With g_Sample_vbs
    .FullPath = g_SrcPath
  End With
End Sub

Sub main2( Opt, AppKey )
  g_SrcPath = WScript.ScriptFullName : Declare_g_Sample_vbs
     :
g_debug=0
main.vbs
インクルードしたファイルがコンパイルエラーしたときは、g_is_compile_debug = 1 として
起動すると、コンパイルエラーがあった vbs ファイルがある行を開きます。 ただし、
  '--- start of parameters for vbslib include -------------------------------
  g_debug = 0          '// release:0, debug:99, -1:call SetupDebugTools
Dim g_is_compile_debug : g_is_compile_debug = 1
に、行番号を指定して開くことができるテキストエディタが
すでに登録してある必要があります。
→ T_CompileDebug フォルダ
テスト
簡易版
エラーが発生したら、エラーが発生した瞬間でブレーク(一時停止)するために必要な、
デバッガにアタッチして、1つ目のエラーでブレークする
g_debug = 1
テスト
ブレークしたい場所に Stop 命令を記述してデバッガーに接続しても、RunProg 関数など
で起動した子プロセスが Stop 命令を実行したときは、ブレークしません。
WSH のデバッガーがインストールされていれば、スクリプト・ファイルへのショートカッ
トを作成、プロパティ - リンク先に、下記の /g_debug オプションを追加、ショートカ
ットから起動すると、問題がある場所で停止します。
----------------------------------------------------------------------
"T_Sample.vbs" /g_debug:1
----------------------------------------------------------------------
<ERROR msg="変数が定義されていません" key="${Var1}+${Var2}"/>
表示されるエラーメッセージの例
Sample.vbs
関連
多くの場合、vbslib の内部関数の中でブレークしてしまうので、自分が扱っているスクリプトが
見つかるまで、コールスタック(デバッグ | ウィンドウ | 呼び出し履歴)を開いて、探してください。
深い
浅い
もう1つは、メイン・スクリプトの
の中にある g_debug = 0 を編集して
1つは、*.vbs ファイルのショートカットを作成して、右クリック [ プロパティ ] の [ リンク先 ]
に、/g_debug:1 オプションを設定してください。
...\sample.vbs /g_debug:1
リンク先:
1つ目のエラーでブレークする
などに設定すべき値が自動的に表示されます。
デバッガーは、Visual Studio Community 以上、または MS-Office 付属の
ブレークしたいソースの場所に、Stop:OrError を記述して実行してください。
2回目以降でブレークする方法
関連
ください。 編集したら、スクリプトを再度実行してください。
Microsoft Script
Editor
 に含まれています。 無料の
下記のファイルをテキストエディタで開いて次のように変数の値を修正すると、デバッガ
に接続して問題がある場所で停止します。
"sample.vbs"
----------------------------------------------------------------------
g_debug = 1
----------------------------------------------------------------------
<ERROR err_number='1' err_description='Stop:OrError'/>
その状態で実行すると、Stop:OrError を記述した場所でブレークします。
g_debug などの変数に設定すべき値が書かれたコードが表示されます。 このコードを、
メイン.vbs の最後にある SetupVbslibParameters 関数の最後に記述してください。
Stop:OrError
として起動するだけで、デバッガーに接続します。
/g_debug:1 にすると、1つ目のエラーでブレークします。
cscript sample.vbs /g_debug:99
コマンドライン:
リンク先:
"C:\Folder\sample.vbs" /g_debug:99
がインストールしてある環境では、
関連
scd10jp.exe
も使えます。
テスト
→ T_Err2_Tree
"C:\Folder\sample.vbs" /g_debug:2,1;1
のような複雑な記述もできます。 記述すべき値はエラーメッセージに表示されます。
エラーが発生した瞬間でブレークさせるには、2つの方法があります。
コロンの次は、
、コンマの次は、
、セミコロンの次は、
に設定されます。
その代り、Stop:OrError と記述すると、ブレークするために必要な方法が表示されます。
参考
→ T_ChildProcessIDNest_Manually2.vbs
または、ショートカットを作成して、ショートカットを右クリック [ プロパティ ] の、
vbslib を使用しているスクリプトは、
デバッガーとは、スクリプトの実行を一時的に止めて、変数の値を確認することなどができる
ツールです。 正しい値で処理されているところと、誤った値で処理されているところを
挟み込んでいくようにして、問題がある場所を見つける作業を支援します。
インストール
デバッガーの起動の仕方
Mircrosoft 製のデバッガーは、すべて同じ手順でデバッガーを起動できます。
vbslib を使っているスクリプトの場合:
vbslib を使わない場合:
その他の手順
Visual Studio 2008 Professtional で、VBScript (WSH) をデバッグ
一部のオブジェクト(静的オブジェクト)は、DefineInfo.FullPath プロパティに、クラスを定義
しているソースのフル・パスが入っています。DefineInfo プロパティが無くても、メソッドに
ステップインしたときのソースの1行目から分かります。
開いているソースのフル・パスは、1行目に自動的に挿入されています。
ただし、Visual Studio 2010 以後は、インクルードしたすべてのスクリプトファイルの内容が
1つの [eval code] ウィンドウにまとめられてしまいますので、「'// g_SrcPath="」 で前方
検索してください。
"C:\Folder\sample.vbs" /g_debug__:2,1;1
一時的にデバッガーの接続をしないときは、d_debug オプション全体を消さなくても、オプション
の名前を少し変更するだけでできます。 こうすれば、再接続するときに、オプションのパラメー
ターを入力し直す必要がなくなります。
(メモ) これができるのは、無効なオプションを VBScript がエラーにしないためです。
デバッガーに表示されているソース コードをテキスト エディターで開くときは、
を実行してください。
関連
g_debug__